﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class OrdenCompraItem
    {
        public int Add(
            dbGestionDataContext _db,
            int? idComparativoItemSelecPrv,
            int idOrdeCompra,
            int idInsumo,
            string codigo,
            string descripcion,
            string unidad,
            decimal descuento,
            decimal cantidad,
            decimal precioInclIGV,
            decimal precioNoIGV,
            decimal IGVItem,
            decimal subMontoIGV,
            decimal subMonto
            )
        {

            this.idComparativoItemSelecPrv =idComparativoItemSelecPrv;
            this.idOrdenCompra = idOrdeCompra;
            this.codigo = codigo;
            this.Descripcion = descripcion;
            this.descuento = descuento;
            this.unidad = unidad;
            this.cantidad = cantidad;
            this.precioInclIGV = precioInclIGV;
            this.precioNoIGV = precioNoIGV;
            this.IGVItem = IGVItem;
            this.subMontoIGV = subMontoIGV;
            this.subMonto = subMonto;
            this.bitActivo = true;
            this.idInsumo = idInsumo;
            this.cantidadRecep = 0;

            _db.OrdenCompraItems.InsertOnSubmit(this);
            _db.SubmitChanges();
            return this.idInternal;
        }


        public void SetUpdate(
            dbGestionDataContext _db,
            string codigo,
            string descripcion,
            string unidad,
            decimal descuento,
            decimal cantidad,
            decimal precioInclIGV,
            decimal precioNoIGV,
            decimal IGVItem,
            decimal subMontoIGV,
            decimal subMonto
            )
        {

            this.codigo = codigo;
            this.Descripcion = descripcion;
            this.descuento = descuento;
            this.unidad = unidad;
            this.cantidad = cantidad;
            this.precioInclIGV = precioInclIGV;
            this.precioNoIGV = precioNoIGV;
            this.IGVItem = IGVItem;
            this.subMontoIGV = subMontoIGV;
            this.subMonto = subMonto;

          
            
        }


        public void SetUpdateComparativoSelectProv(
                   int idComparativoItemSelecPrv )
                {

                this.idComparativoItemSelecPrv = idComparativoItemSelecPrv;
                }

       

        public void SetUpdateTotalNOIGV(dbGestionDataContext _db,
                                         decimal subMonto)
        {
            decimal cantidadcalc = subMonto / this.precioNoIGV.Value;

           // verificaSaldoComparativo();

            this.cantidad = Math.Round(Convert.ToDecimal(cantidadcalc), 5);
            this.subMonto = subMonto;
            this.subMontoIGV = this.subMonto * (1 + this.OrdenCompra.igv.Value );
            this.IGVItem = this.subMontoIGV - this.subMonto;


        }

        public void SetUpdateTotalSIIGV(dbGestionDataContext _db,
                                    decimal montoIGV)
        {
            decimal cantidadcalc = montoIGV / this.precioInclIGV.Value;
            
            


            this.cantidad = Math.Round(Convert.ToDecimal(cantidadcalc), 5);
            this.subMontoIGV = montoIGV;
            this.subMonto = this.subMontoIGV / (1 + this.OrdenCompra.igv.Value);
            this.IGVItem = this.subMontoIGV - this.subMonto;


        }

        


        public void updateCantRecepcion(dbGestionDataContext _db
            )
        {
            decimal cant=0;
            decimal? q = (from a in _db.NotaIngresoItems
                    where a.idRefItem == this.idInternal
                    select a).Sum(p=>p.cantidad);
            if (q.HasValue)
            {
                cant= q.Value;
            }
            this.cantidadRecep = cant;

            if (this.cantidad < this.cantidadRecep)
            {
                throw new Exception("La cantidad de Recepcion No puede ser mayor al Registrado");
            }
            _db.SubmitChanges();
         }




        /// <summary>
        /// Importante si incluye o no IGV  en la orden de Compra
        /// </summary>
        /// <param name="_db"></param>
        /// <param name="idOrdenCompraItem"></param>
        /// <param name="idComparativoItemSelecPrv"></param>
        /// <param name="bitInclIGV"></param>
        /// <returns></returns>
        public decimal GetMontoDispINCLIGVWithOUT(dbGestionDataContext _db)
        {

            decimal total = 0;
            var totalComparativo = 
                                _db.ComparativoItemSelecPrv.Single(p => p.idInternal == this.idComparativoItemSelecPrv).total;
            var q = from a in _db.OrdenCompraItems
                    where a.idComparativoItemSelecPrv ==this.idComparativoItemSelecPrv
                           & a.idInternal != this.idInternal
                    select a;
            if (q.Count() > 0)
            {
                //if (this.OrdenCompra.bitInclIGV.Value)
                //{
                    total = totalComparativo.Value - q.Sum(p => p.subMontoIGV.Value);
               // }
                //else
                //{
                //    total = totalComparativo.Value - q.Sum(p => p.subMonto.Value);
                //}

            }

            return total;


        }


        public decimal GetMontoDispNOIGVIGVWithOUT(dbGestionDataContext _db)
        {   
            decimal total =
                                _db.ComparativoItemSelecPrv.Single(p => p.idInternal == this.idComparativoItemSelecPrv).total.Value;
            var q = from a in _db.OrdenCompraItems
                    where a.idComparativoItemSelecPrv == this.idComparativoItemSelecPrv
                           & a.idInternal != this.idInternal
                    select a;
            if (q.Count() > 0)
            {
                //if (this.OrdenCompra.bitInclIGV.Value)
                //{
                 //   total = totalComparativo.Value - q.Sum(p => p.subMontoIGV.Value);
               // }
                //else
               // {
                total = total - q.Sum(p => p.subMonto.Value);
               // }

            }

            return total;


        }



        public decimal GetCantidadDispWithOUT(dbGestionDataContext _db)
        {
            return 
                this.ComparativoItemSelecPrv.cantidad.Value-
                this.ComparativoItemSelecPrv.cantidadUso.Value+
                this.cantidad.Value;
                        

        }


    }
}
